
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { __extends } from 'tslib';
import * as echarts from '../../../core/echarts.js';
import * as zrUtil from 'zrender/lib/core/util.js';
import { ToolboxFeature } from '../featureManager.js';
import { SINGLE_REFERRING } from '../../../util/model.js';
var INNER_STACK_KEYWORD = '__ec_magicType_stack__';
var ICON_TYPES = ['line', 'bar', 'stack']; // stack and tiled appears in pair for the title

var TITLE_TYPES = ['line', 'bar', 'stack', 'tiled'];
var radioTypes = [['line', 'bar'], ['stack']];

var MagicType =
/** @class */
function (_super) {
	__extends(MagicType, _super);

	function MagicType() {
		return _super !== null && _super.apply(this, arguments) || this;
	}

	MagicType.prototype.getIcons = function () {
		var model = this.model;
		var availableIcons = model.get('icon');
		var icons = {};
		zrUtil.each(model.get('type'), function (type) {
			if (availableIcons[type]) {
				icons[type] = availableIcons[type];
			}
		});
		return icons;
	};

	MagicType.getDefaultOption = function (ecModel) {
		var defaultOption = {
			show: true,
			type: [],
			// Icon group
			icon: {
				line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4',
				bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7',
				// eslint-disable-next-line
        stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z' // jshint ignore:line

			},
			// `line`, `bar`, `stack`, `tiled`
			title: ecModel.getLocaleModel().get(['toolbox', 'magicType', 'title']),
			option: {},
			seriesIndex: {}
		};
		return defaultOption;
	};

	MagicType.prototype.onclick = function (ecModel, api, type) {
		var model = this.model;
		var seriesIndex = model.get(['seriesIndex', type]); // Not supported magicType

		if (!seriesOptGenreator[type]) {
			return;
		}

		var newOption = {
			series: []
		};

		var generateNewSeriesTypes = function (seriesModel) {
			var seriesType = seriesModel.subType;
			var seriesId = seriesModel.id;
			var newSeriesOpt = seriesOptGenreator[type](seriesType, seriesId, seriesModel, model);

			if (newSeriesOpt) {
				// PENDING If merge original option?
				zrUtil.defaults(newSeriesOpt, seriesModel.option);
				newOption.series.push(newSeriesOpt);
			} // Modify boundaryGap

			var coordSys = seriesModel.coordinateSystem;

			if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) {
				var categoryAxis = coordSys.getAxesByScale('ordinal')[0];

				if (categoryAxis) {
					var axisDim = categoryAxis.dim;
					var axisType = axisDim + 'Axis';
					var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0];
					var axisIndex = axisModel.componentIndex;
					newOption[axisType] = newOption[axisType] || [];

					for (var i = 0; i <= axisIndex; i++) {
						newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {};
					}

					newOption[axisType][axisIndex].boundaryGap = type === 'bar';
				}
			}
		};

		zrUtil.each(radioTypes, function (radio) {
			if (zrUtil.indexOf(radio, type) >= 0) {
				zrUtil.each(radio, function (item) {
					model.setIconStatus(item, 'normal');
				});
			}
		});
		model.setIconStatus(type, 'emphasis');
		ecModel.eachComponent({
			mainType: 'series',
			query: seriesIndex == null ? null : {
				seriesIndex: seriesIndex
			}
		}, generateNewSeriesTypes);
		var newTitle;
		var currentType = type; // Change title of stack

		if (type === 'stack') {
			// use titles in model instead of ecModel
			// as stack and tiled appears in pair, just flip them
			// no need of checking stack state
			newTitle = zrUtil.merge({
				stack: model.option.title.tiled,
				tiled: model.option.title.stack
			}, model.option.title);

			if (model.get(['iconStatus', type]) !== 'emphasis') {
				currentType = 'tiled';
			}
		}

		api.dispatchAction({
			type: 'changeMagicType',
			currentType: currentType,
			newOption: newOption,
			newTitle: newTitle,
			featureName: 'magicType'
		});
	};

	return MagicType;
}(ToolboxFeature);

var seriesOptGenreator = {
	'line': function (seriesType, seriesId, seriesModel, model) {
		if (seriesType === 'bar') {
			return zrUtil.merge({
				id: seriesId,
				type: 'line',
				// Preserve data related option
				data: seriesModel.get('data'),
				stack: seriesModel.get('stack'),
				markPoint: seriesModel.get('markPoint'),
				markLine: seriesModel.get('markLine')
			}, model.get(['option', 'line']) || {}, true);
		}
	},
	'bar': function (seriesType, seriesId, seriesModel, model) {
		if (seriesType === 'line') {
			return zrUtil.merge({
				id: seriesId,
				type: 'bar',
				// Preserve data related option
				data: seriesModel.get('data'),
				stack: seriesModel.get('stack'),
				markPoint: seriesModel.get('markPoint'),
				markLine: seriesModel.get('markLine')
			}, model.get(['option', 'bar']) || {}, true);
		}
	},
	'stack': function (seriesType, seriesId, seriesModel, model) {
		var isStack = seriesModel.get('stack') === INNER_STACK_KEYWORD;

		if (seriesType === 'line' || seriesType === 'bar') {
			model.setIconStatus('stack', isStack ? 'normal' : 'emphasis');
			return zrUtil.merge({
				id: seriesId,
				stack: isStack ? '' : INNER_STACK_KEYWORD
			}, model.get(['option', 'stack']) || {}, true);
		}
	}
}; // TODO: SELF REGISTERED.

echarts.registerAction({
	type: 'changeMagicType',
	event: 'magicTypeChanged',
	update: 'prepareAndUpdate'
}, function (payload, ecModel) {
	ecModel.mergeOption(payload.newOption);
});
export default MagicType;